package com.browsesoft;

import java.util.Hashtable;
import java.util.Iterator;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.w3c.dom.Element;

import com.aote.mvc.event.ActionFactory;
import com.browsesoft.authentication.AuthenticationException;
import com.browsesoft.authentication.AuthenticationFactory;
import com.browsesoft.authentication.AuthenticationMode;
import com.browsesoft.htmlcomponent.HTMLBasicComponent;
import com.browsesoft.htmlcomponent.HTMLFormModel;
import com.browsesoft.log.OperateLog;
import com.browsesoft.tools.BSCalendar;
import com.browsesoft.user.User;

/*登陆model
 *
 */
public class LoginModel implements HTMLFormModel {
	/**
	 * 密码规则设置表
	 */
	protected HTMLBasicComponent component = null;

	protected HttpServletRequest request = null;

	// 模型的属性
	private Hashtable attributes = new Hashtable();

	/**
	 * 初始化model
	 * 
	 * @throws Exception
	 */
	public void init(HttpServletRequest request) throws Exception {
	}

	public void service(HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		// 如果请求中没有用户名
		if (request.getParameter("loginUser") == null) {
			// 第一次进，不做检查
			return;
		}
		Element ce = this.component.getElement();
		try {
			AuthenticationMode mode = getAutenticationMode(request);
			// 从认证模式得到用户
			User user = mode.authenticate(request);
			//if(UserLoginedCheck.hasUser(user))
			//{
			//	this.component.getPage().addOnload("alert('此用户已登陆！')");
			//    return;
			//}
			// UserLoginedCheck.addUser(user);
			user.getAttributes().put("logined","yes");
			this.attributes.put("user", user);
			request.getSession().setAttribute("loginUser", user);
			// 登陆用户登陆次数加1
			user.incLoginNumber();
			// 放入用户ip
			String hostName = request.getRemoteAddr();
			user.getAttributes().put("loginip", hostName);
			// 放入用户登陆时间
			String nowTime = BSCalendar.now().toString("yyyy-mm-dd hh:tt");
			user.getAttributes().put("logintime", nowTime);
			// 用户操作日志
			OperateLog operateLog = new OperateLog();
			operateLog.loginLog(user);
			// 为了改变登录两次得现象,将修改页面action改为请求分发,
			this.sendToMainPage(user, request, response);
			// 向aip_session表插入记录
			ActionFactory actionFact = new ActionFactory(this.component);
			// 如果项目中用到电子印章，在login.html中添加
			// <action name="sessionlog"
			// class="com.aote.entity.action.LoginAction"/>
			if (actionFact.hasAction("sessionlog")) {
				actionFact.doAction("sessionlog", request, this.attributes);
			}
		} catch (AuthenticationException ex) {
			String errorcode = ce.getAttribute("errorcode");
			if (errorcode == null || errorcode.equals("")) {
				errorcode = "wrongmessagebox()";
			}
			// 进入页面时，提示密码错误
			this.component.getPage().addOnload(errorcode);
		}
	}
	
	

	/**
	 * 根据请求参数，得到认证模式，如果没有指定，用默认认证模式
	 * 
	 * @param request
	 *            请求，参数authenticationModel指明认证模式，如果参数不存在，用默认模式
	 * @return 认证模式
	 */
	private AuthenticationMode getAutenticationMode(HttpServletRequest request) {
		String smode = request.getParameter("authenticationModel");
		// 参数不存在，使用默认认证模式
		if (smode == null || smode.equals("")) {
			smode = "simple";
		}
		AuthenticationMode mode = AuthenticationFactory.getInstance().getMode(
				smode);
		return mode;
	}

	/**
	 * 更新属性
	 * 
	 */
	public void updateAttributes(Hashtable attr) throws Exception {
	}

	/**
	 * 得到属性
	 * 
	 * @return 存储属性的哈息表
	 */
	public Hashtable getAttributes() throws Exception {
		return this.attributes;
	}

	/**
	 * 得到选择列表
	 * 
	 * @param name
	 *            名字
	 * @return 列表
	 */
	public Iterator getOptions(String name) throws Exception {
		return null;
	}

	public void setComponent(HTMLBasicComponent component) {
		this.component = component;
	}

	/**
	 * 模型更新页面元素
	 * 
	 * @throws Exception
	 */
	public void updatePageElement(HTMLBasicComponent c) throws Exception {
	}

	/**
	 * 设置action
	 */
	public void setAction(User user) {
		// 设置Form提交值
		Element ee = (Element) this.component.getPage().getDocument()
				.getElementsByTagName("form").item(0);
		// 设置topage属性
		String action = this.component.getElement().getAttribute("topage");
		// 如果action为空
		if (action == null || action.equals("")) {
			action = "main.jsp";
		}
		String str = ee.getAttribute("custom");
		// 如果form上有custom="custom"标记
		if (str != null && str.equals("custom")) {
			// 得到用户所对应的首页模板名
			String templatename = user.getMainpage();
			// 如果首页模板名为空
			if (templatename != null && !templatename.equals("")) {
				// 给action赋值
				action = "loginindex.jsp?templatename=" + templatename;
			}
			// 否则
			else {
				// 设置topage属性
				action = this.component.getElement().getAttribute("topage");
			}
		}
		ee.setAttribute("action", action);
	}

	/**
	 * 转向登录后得主页面
	 */
	public void sendToMainPage(User user, HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		// 设置Form提交值
		Element ee = (Element) this.component.getPage().getDocument()
				.getElementsByTagName("form").item(0);
		// 设置topage属性
		String action = this.component.getElement().getAttribute("topage");
		// 如果action为空
		if (action == null || action.equals("")) {
			action = "main.jsp";
		}
		String str = ee.getAttribute("custom");
		// 如果form上有custom="custom"标记
		if (str != null && str.equals("custom")) {
			// 得到用户所对应的首页模板名
			String templatename = user.getMainpage();
			// 如果首页模板名为空
			if (templatename != null && !templatename.equals("")) {
				// 给action赋值
				action = "loginindex.jsp?templatename=" + templatename;
			}
			// 否则
			else {
				// 设置topage属性
				action = this.component.getElement().getAttribute("topage");
			}
		}
		// 转向
		String toURL = action;
		response.sendRedirect(toURL);
	}
}
